package learn_funcs

import (
	"fmt"
	"go/types"
	"strings"
)

// 函数定义，闭包
func sayHello() (t types.Nil) {
	t = sayHello()
	return
}

func ageManyArguments(b int, a ...int) (res int) {
	for _, item := range a {
		res += item
	}
	return
}

// 函数参数类型简写 defer
func calcArguments(a, b int) {
	// defer 的语句在函数结束的时候执行
	defer fmt.Println("defer")
	fmt.Println("end")
}

// 变量作用域
const (
	keep int = 0
)

var (
	keep2 int = 3
)

// 函数作用域和全局作用域，还有块级作用域，for块还有if块
func test(a, b int) int {
	return a + b
}

func test2() {
	// 函数可以作为变量被引用
	test := test
	add(test)
}

// 函数作为参数
func add(f func(int, int) int) {
	f(1, 2)
}

// 匿名函数

func niming() {
	say := func() {
		fmt.Println(222)
	}
	// 立即执行函数
	func() {}()
}

// 实现闭包，返回一个函数
func fanhuihanshu(name string) func() {
	a := 10
	return func() {
		fmt.Println(a)
		fmt.Println(name)
	}
}

func makess() func(string) string {
	return func(name string) string {
		if !strings.HasSuffix(name, ".go") {
			name += ".go"
		}
		return name
	}
}

func hasError() {
	// 异常处理，recover 一定要和 defer组合使用
	// defer 要定义在 panic 之前
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("hasError 运行出错了")
		}
	}()
	panic("出错了")
}

// 内置函数
// make new close len append panic recover
